/**
**********************************************************************
* @file     public.h
* @brief    对文件的简要说明
* @details  对文件的详细说明
* @author   jcai
* @date     2022-04-24 00:32:09
* @copyright Copyright &copy; 2022 wy1107412334@163.com All rights reserved
* @version  v0.0.1
*
* \n Email:  wy1107412334@163.com
* \n Blog:   None
* \n Github: https://github.com/wy1107412334
* \n Gitee:  https://gitee.com/git.git1107412334.com
*
**********************************************************************
* @note
* None.
**********************************************************************
* @attention
* None.
**********************************************************************
@verbatim
@endverbatim
**********************************************************************
* @par 历史记录
* 1. v0.0.1: jcai, 2022-04-24 00:32:09
*   - 首次编写
*
*<center>Copyright &copy; 2022 wy1107412334@163.com All rights reserved</center>
**********************************************************************
*/

#ifndef __PUBLIC_H__
#define __PUBLIC_H__


/* 头文件导入区 --------------------------------------------------- */

#include "stm32f10x.h"


#ifdef __cplusplus
extern "C"
{
#endif

/** @addtogroup PUBLIC
* @brief public modules
* @{
*/


/** @defgroup PUBLIC_CompilationDefines public compilation defines
* @brief 条件编译定义
* @{
*/



/** defgroup PUBLIC_CompilationDefines
* @}
*/


/** @defgroup PUBLIC_Input_Interface public Input API Interface
* @brief 模块输入API接口。即对外部少量依赖模块的API接口
* @{
*/



/** defgroup PUBLIC_Input_Interface
* @}
*/


/** @defgroup PUBLIC_Exported_MacroDefines public exported macro defines
* @brief 全局宏定义
* @{
*/

/**
 * 告诉编译器不要丢弃
 *
 * 编译器在编译的时候会丢弃没有被使用的函数或变量，但是我们不想
 * 编译器把它们丢弃。
 *
 * 编译器就为这种情况提供了一种语法，我们在没有使用但是又不想
 * 被编译器丢弃的函数或变量的定义处写上该语法，编译器就不会
 * 丢弃它们了。
 *
 * 那么，这里就写上你实际使用的编译器提供的有上述功能的语法吧。
 */
#define portDONT_DISCARD      __attribute__( ( used ) )

typedef void (*vfnv_t)(void);   /*!< 一个无参无返回值的函数指针类型 */


/* 将保存硬件初始化函数的地址的变量定义到链接脚本的 .bsp_init_array 节中 */
#define _BSP_INIT_ATTR_         \
        __attribute__ ((section(".bsp_init_array"), used))
#define _BSP_INIT_ATTR_PRI_(id) \
        __attribute__ ((section(".bsp_init_array."#id, used)))
/**
 * @brief 在初始化硬件的函数中调用名为 funcname 的函数
 * @details 在函数 hardware_init_hook() 中自动调用名为 funcname 的函数
 * @param funcname: 函数名
 * @note 函数 funcname 的调用顺序由编译器决定。并且在 BSP_INIT_EXPORT_PRI()
 *       指定的函数调用完后再调用。
 *       如果要指定编译顺序请使用 BSP_INIT_EXPORT_PRI()
 */
#define BSP_INIT_EXPORT(funcname) \
    const vfnv_t _BSP_INIT_ATTR_ fBspInit_##funcname = (vfnv_t) funcname
/**
 * @brief 在初始化硬件的函数中以 pri 指定的顺序调用名为 funcname 的函数
 * @details 在函数 hardware_init_hook() 中按照 pri 指定的顺序调用名为
 *          funcname 的函数。 pri 的值越小，那么优先级越高。
 * @param funcname: 函数名
 * @param pri: 函数 funcname 的调用顺序。值从0开始
 * @note 在整个工程中 pri 的值最好唯一。如果出现相同的 pri 那么其调用顺序未知
 */
#define BSP_INIT_EXPORT_PRI(funcname, pri) \
    const vfnv_t _BSP_INIT_ATTR_PRI_(pri) fBspInit_##funcname = \
                                                       (vfnv_t) funcname

/* 将保存应用初始化函数的地址的变量定义到链接脚本的 .app_init_array 节中 */
#define _APP_INIT_ATTR_         \
        __attribute__ ((section(".app_init_array"), used))
#define _APP_INIT_ATTR_PRI_(id) \
        __attribute__ ((section(".app_init_array"#id), used))
/**
 * @brief 在初始化应用的函数中调用名为 funcname 的函数
 * @details 在函数 software_init_hook() 中自动调用名为 funcname 的函数
 * @param funcname: 函数名
 * @note 函数 funcname 的调用顺序由编译器决定。并且在 BSP_INIT_EXPORT_PRI()
 *       指定的函数调用完后再调用。
 *       如果要指定编译顺序请使用 BSP_INIT_EXPORT_PRI()
 */
#define APP_INIT_EXPORT(funcname) \
    const vfnv_t _APP_INIT_ATTR_ fAppInit_##funcname = (vfnv_t) funcname
/**
 * @brief 在初始化应用的函数中以 pri 指定的顺序调用名为 funcname 的函数
 * @details 在函数 software_init_hook() 中按照 pri 指定的顺序调用名为
 *          funcname 的函数。 pri 的值越小，那么优先级越高。
 * @param funcname: 函数名
 * @param pri: 函数 funcname 的调用顺序。值从0开始
 * @note 在整个工程中 pri 的值最好唯一。如果出现相同的 pri 那么其调用顺序未知
 */
#define APP_INIT_EXPORT_PRI(funcname, pri) \
    const vfnv_t _APP_INIT_ATTR_PRI_(pri) fAppInit_##funcname = \
                                                       (vfnv_t) funcname


/** defgroup PUBLIC_Exported_MacroDefines
* @}
*/


/** @defgroup PUBLIC_Exported_Types public exported types
* @brief 全局数据类型声明
* @{
*/



/** defgroup PUBLIC_Exported_Types
* @}
*/






/*********************************************************************
                全局变量声明
*********************************************************************/







/*********************************************************************
                全局函数声明
*********************************************************************/








/** addtogroup PUBLIC
* @}
*/

#ifdef __cplusplus
}
#endif
#endif // __PUBLIC_H__


/***  Copyright (C) 2022 wy1107412334@163.com All rights reserved ***/
/****************************** END OF FILE *************************/

